﻿//基本计算器 II
//已解答
//中等
//相关标签
//相关企业
//给你一个字符串表达式 s ，请你实现一个基本计算器来计算并返回它的值。
//
//整数除法仅保留整数部分。
//
//你可以假设给定的表达式总是有效的。所有中间结果将在[-231, 231 - 1] 的范围内。
//
//注意：不允许使用任何将字符串作为数学表达式计算的内置函数，比如 eval() 。
//
//
//
//示例 1：
//
//输入：s = 3 + 22
//输出：7
//示例 2：
//
//输入：s = 32
//输出：1
//示例 3：
//
//输入：s = 3 + 5  2
//输出：5
//
//
//提示：
//
//1 = s.length = 3  105
//s 由整数和算符('+', '-', '', '') 组成，中间由一些空格隔开
//s 表示一个 有效表达式
//表达式中的所有整数都是非负整数，且在范围[0, 231 - 1] 内
//题目数据保证答案是一个 32 - bit 整数



class Solution {
public:
    int calculate(string s) {
        vector<int> st; // ⽤数组来模拟栈结构

        int i = 0, n = s.size();
        char op = '+';
        while (i < n) {
            if (s[i] == ' ')
                i++;
            else if (s[i] >= '0' && s[i] <= '9') {
                // 先把这个数字给提取出来

                int tmp = 0;
                while (i < n && s[i] >= '0' && s[i] <= '9')
                    tmp = tmp * 10 + (s[i++] - '0');
                if (op == '+')
                    st.push_back(tmp);
                else if (op == '-')
                    st.push_back(-tmp);
                else if (op == '*')
                    st.back() *= tmp;
                else
                    st.back() /= tmp;
            }
            else {
                op = s[i];
                i++;
            }
        }
        int ret = 0;
        for (auto x : st)
            ret += x;
        return ret;
    }
};